/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.bodylimit.dao;

import br.com.bodylimit.model.Aluno;
import br.com.bodylimit.model.Funcionario;
import br.com.bodylimit.model.Presenca;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author João Paulo
 */
public class PresencaDAOPostgres implements PresencaDAO{

     Connection con;

     public PresencaDAOPostgres(Connection con) {
         this.con = con;
     }



     private List<Presenca> popular(ResultSet rs) throws SQLException{
         List<Presenca> presencas = new ArrayList<Presenca>();
         Presenca presenca;
         Aluno aluno;
         Funcionario funcionario;
         while(rs.next()) {
            presenca = this.popularUm(rs);
            aluno = new AlunoDAOPostgres(con).popularUm(rs);
            funcionario = new FuncionarioDAOPostgres(con).popularUm(rs);

            presenca.setAluno(aluno);
            presenca.setFuncionario(funcionario);

            presencas.add(presenca);
         }
         rs.close();
         return presencas;
     }

     public Presenca popularUm(ResultSet rs) throws SQLException{
         Presenca presenca = new Presenca();
         String hora;
         String[] partesHora;
         presenca.setData(new Date(rs.getDate("data").getTime()));
         
         hora = rs.getString("hora");
         partesHora = hora.split(":");

         presenca.getData().setHours(Integer.parseInt(partesHora[0]));
         presenca.getData().setMinutes(Integer.parseInt(partesHora[1]));

         return presenca;
     }


    public void adcionar(Presenca presenca) throws SQLException {
        ResultSet rs;
        String sql = "INSERT INTO presenca(data, matAluno, matFunc) values(?, ?, ?)";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setDate(1, new java.sql.Date(presenca.getData().getTime()));
        stmt.setInt(2, presenca.getAluno().getMatricula());
        stmt.setInt(3, presenca.getFuncionario().getMatricula());
        
        stmt.executeUpdate();

        stmt.close();
    }

    public void remover(Date data, int matricula) throws SQLException {
        ResultSet rs;
        String sql = "DELETE FROM presenca WHERE data = ? AND matAluno = ?";

        PreparedStatement stmt = con.prepareStatement(sql);

        stmt.setDate(1, new java.sql.Date(data.getTime()));
        stmt.setInt(2, matricula);

        stmt.executeUpdate();

        stmt.close();
    }

    /**
     * Lista todos os presentes no dia atual
     * @return
     * @throws SQLException
     */
    public List<Presenca> listar() throws SQLException {
        return listar(new Date());
    }

    /**
     * Lista todos os presentes na data date
     * @param date
     * @return
     * @throws SQLException
     */
    public List<Presenca> listar(Date date) throws SQLException{
        String sql = "SELECT * FROM presenca p NATURAL JOIN aluno NATURAL JOIN funcionario WHERE p.data = ? ORDER BY hora";
        ResultSet rs;
        List<Presenca> presencas;
        PreparedStatement stmt = con.prepareStatement(sql);


        stmt.setDate(1, new java.sql.Date(date.getTime()));
        rs = stmt.executeQuery();


        presencas = popular(rs);

        rs.close();
        stmt.close();

        return presencas;
    }

}
